/*
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is ST_EXT-S_UIMAST.
 *
 * The Initial Developer of the Original Code is
 * University of Rome, Tor Vergata
 * Portions created by the Initial Developer are Copyright (C) 2009
 * the Initial Developer. All Rights Reserved.
 */

package it.uniroma2.art.uimast.impl.types;

import it.uniroma2.art.ontapi.ARTResource;
import it.uniroma2.art.ontapi.vocabulary.XmlSchema;
import it.uniroma2.art.uimast.xpts.IVariantVisitor;
import it.uniroma2.art.uimast.xpts.Variant;

import javax.xml.bind.DatatypeConverter;

/**
 * A variant able to hold <code>short</code> values.
 * 
 * @author <a href="mailto:manuel.fiorelli@gmail.com">Manuel Fiorelli</a>
 * 
 */
public class ShortVariant extends Variant {
	
	public void applyVisitor(IVariantVisitor visitor) {
		visitor.visit(this);
	}

	@Override
	public boolean isCompatible(ARTResource cls) {
		// This variant is only compatible with xsd:short.
		return cls.getURI().equals(XmlSchema.SHORT);
	}

	@Override
	public boolean isLexicalRepresentation(String lexicalForm) {
		try {
			// tries to parse the given string to decide if it is a valid lexical form.
			parse(lexicalForm);
		} catch (IllegalArgumentException e) {
			return false;
		}
		return true;
	}

	@Override
	public boolean setValue(String lexicalForm) {
		try {
			value = parse(lexicalForm);
		} catch (IllegalArgumentException e) {
			return false;
		}
		return true;
	}

	/**
	 * Parses a lexical representation of the underlying type.
	 * 
	 * @param lexicalForm
	 *            a lexical representation
	 * @return the corresponding value
	 * @throws IllegalArgumentException
	 */
	private short parse(String lexicalForm) throws IllegalArgumentException {
		return DatatypeConverter.parseShort(lexicalForm);
	}

	@Override
	public String getLexicalRepresentation() {
		return "" + value;
	}

	/**
	 * Gets the underlying string value.
	 * 
	 * @return the underlying value
	 */
	public short getValue() {
		return value;
	}

	@Override
	public String getValueAsString() {
		return (new StringBuilder()).append(value).toString();
	}

	/** The underlying value. */
	private short value;
}
